/**
 * @file aodv_types.h
 * @brief AODV路由协议核心数据类型定义
 * 
 * 该文件定义了AODV协议实现所需的各种数据结构、枚举类型和常量。
 * 这些类型是AODV协议栈各个模块之间数据交换的基础，确保了协议
 * 实现的一致性和可维护性。
 */
#ifndef AODV_TYPES_H
#define AODV_TYPES_H

#include <stdint.h>

/**
 * @brief AODV消息类型枚举
 * 
 * 定义了AODV协议中使用的四种主要控制消息类型，每种消息类型
 * 对应不同的协议功能和处理流程。
 */
typedef enum {
    MESSAGE_TYPE_RREQ = 1,    // 路由请求消息，用于启动路由发现过程
    MESSAGE_TYPE_RREP = 2,    // 路由回复消息，用于响应RREQ并建立路由
    MESSAGE_TYPE_RERR = 3,    // 路由错误消息，用于通知路由失效
    MESSAGE_TYPE_RREP_ACK = 4 // 路由回复确认消息，用于可靠传输RREP
} aodv_message_type_t;

/**
 * @brief 路由表项标志位枚举
 * 
 * 定义了路由表项的状态标志，用于表示路由的有效性和特殊状态。
 * 这些标志可以组合使用，通过位运算进行检查和设置。
 */
typedef enum {
    ROUTE_FLAG_VALID = 0x01,   // 路由有效标志
    ROUTE_FLAG_REPAIR = 0x02,  // 路由正在修复标志
    ROUTE_FLAG_ERROR = 0x04,   // 路由错误标志
    ROUTE_FLAG_INVALID = 0x08  // 路由无效标志
} route_flag_t;

/**
 * @brief 路由类型枚举
 * 
 * 定义了路由的状态类型，用于更直观地表示路由的整体状态。
 */
typedef enum {
    ROUTE_TYPE_ACTIVE,    // 活跃路由，可以正常使用
    ROUTE_TYPE_INVALID,   // 无效路由，不可用
    ROUTE_TYPE_REPAIR     // 正在修复的路由
} route_type_t;

/**
 * @brief 邻居节点状态枚举
 * 
 * 定义了邻居节点的可达性状态，用于链路质量监控。
 */
typedef enum {
    NEIGHBOR_STATUS_ALIVE,  // 邻居节点活跃
    NEIGHBOR_STATUS_DEAD    // 邻居节点不可达
} neighbor_status_t;

/**
 * @brief 定时器类型枚举
 * 
 * 定义了AODV协议中使用的各种定时器类型，用于实现协议的时序控制。
 */
typedef enum {
    TIMER_RREQ_TIMEOUT,           // RREQ超时定时器，控制路由发现重试
    TIMER_RREP_TIMEOUT,           // RREP超时定时器，用于RREP-ACK机制
    TIMER_ROUTE_EXPIRATION,       // 路由过期定时器，控制路由生命周期
    TIMER_HELLO,                  // HELLO消息定时器，控制邻居发现消息发送
    TIMER_NEIGHBOR_EXPIRATION     // 邻居过期定时器，检测邻居节点失效
} timer_type_t;

/**
 * @brief 路由表项结构
 * 
 * 定义了AODV路由表中的单个条目，包含了到达特定目标节点所需的全部信息。
 * 每个条目代表一条从本节点到目标节点的路由。
 */
typedef struct {
    uint32_t destination_ip;       // 目标节点IP地址
    uint32_t next_hop_ip;          // 下一跳节点IP地址，实际转发的节点
    uint32_t destination_seq_num;  // 目标节点序列号，用于路由更新和环路避免
    uint8_t hop_count;             // 跳数，记录到达目标的路径长度
    uint8_t route_flags;           // 路由标志(VALID/INVALID等)，使用route_flag_t
    uint32_t expiration_time;      // 路由过期时间，超过后路由将被删除
    uint32_t active_time;          // 路由最后一次激活的时间
    uint16_t rreq_retries;         // RREQ重传次数，用于路由发现过程
    uint8_t route_type;            // 路由类型(ACTIVE/INVALID等)，使用route_type_t
} route_table_entry_t;

/**
 * @brief 邻居表项结构
 * 
 * 定义了AODV邻居表中的单个条目，用于记录直接相连的邻居节点信息。
 * 邻居表对于路由维护和链路故障检测至关重要。
 */
typedef struct {
    uint32_t neighbor_ip;          // 邻居节点IP地址
    uint8_t hop_count;             // 跳数，始终为1（直接邻居）
    uint8_t status;                // 邻居状态(ALIVE/DEAD等)，使用neighbor_status_t
    uint32_t last_hello_time;      // 最后收到HELLO消息的时间戳
    uint32_t hello_interval;       // HELLO消息发送间隔，用于邻居失效检测
} neighbor_table_entry_t;

/**
 * @brief 路由请求(RREQ)消息结构
 * 
 * 定义了AODV协议中的路由请求消息格式，用于启动路由发现过程。
 * 当节点需要向未知路由的目标发送数据时，会广播此消息。
 */
typedef struct {
    uint8_t type;                  // 消息类型(1表示RREQ)
    uint8_t flags;                 // 标志位，用于特殊路由需求
    uint8_t reserved[2];           // 保留字段，设置为0
    uint32_t rreq_id;              // 请求标识符，与源IP一起唯一标识请求
    uint32_t destination_ip;       // 目标节点IP
    uint32_t destination_seq_num;  // 目标序列号，确保路由新鲜度
    uint32_t source_ip;            // 源节点IP
    uint32_t source_seq_num;       // 源序列号
    uint8_t hop_count;             // 跳数，记录消息经过的节点数
} rreq_message_t;

/**
 * @brief 路由回复(RREP)消息结构
 * 
 * 定义了AODV协议中的路由回复消息格式，用于响应路由请求并建立路由。
 * 目标节点或中间节点在收到RREQ后，如果有可用路由，会返回此消息。
 */
typedef struct {
    uint8_t type;                  // 消息类型(2表示RREP)
    uint8_t flags;                 // 标志位
    uint8_t prefix_size;           // 前缀长度，用于地址聚合
    uint8_t hop_count;             // 跳数，到达目标的路径长度
    uint32_t destination_ip;       // 目标节点IP
    uint32_t destination_seq_num;  // 目标序列号
    uint32_t source_ip;            // 源节点IP
    uint32_t lifetime;             // 路由生存时间，单位毫秒
} rrep_message_t;

/**
 * @brief 路由错误(RERR)消息结构
 * 
 * 定义了AODV协议中的路由错误消息格式，用于通知路由失效。
 * 当节点检测到链路故障时，会生成并广播此消息。
 */
typedef struct {
    uint8_t type;                  // 消息类型(3表示RERR)
    uint8_t flags;                 // 标志位
    uint8_t reserved[2];           // 保留字段，设置为0
    uint8_t dest_count;            // 不可达目标数量
    // 实际使用时会动态分配空间存储不可达目标列表
    // 列表中的每个元素是unreachable_dest_t类型
} rerr_message_t;

/**
 * @brief 不可达目标条目结构
 * 
 * 定义了RERR消息中包含的不可达目标信息，
 * 用于通知网络其他节点哪些目标已不可达。
 */
typedef struct {
    uint32_t dest_ip;           // 不可达目标IP地址
    uint32_t dest_seq_num;      // 不可达目标序列号
} unreachable_dest_t;

/**
 * @brief 定时器结构
 * 
 * 定义了AODV协议中使用的定时器结构，用于实现各种定时功能。
 */
typedef struct {
    timer_type_t type;             // 定时器类型，使用timer_type_t
    uint32_t timeout;              // 超时时间，单位毫秒
    void *data;                    // 相关数据指针，用于超时处理时传递信息
    uint8_t active;                // 是否激活，1表示激活，0表示未激活
} timer_t;

/**
 * @brief AODV配置参数结构
 * 
 * 定义了AODV协议的可配置参数，这些参数直接影响协议的性能和行为。
 */
typedef struct {
    uint32_t hello_interval;       // HELLO消息发送间隔(毫秒)
    uint32_t allowed_hello_loss;   // 允许丢失的HELLO消息数量
    uint32_t active_route_timeout; // 活跃路由超时时间(毫秒)
    uint32_t net_diameter;         // 网络直径估计，最大跳数
    uint32_t node_traversal_time;  // 节点遍历时间(毫秒)
    uint32_t rreq_retry_timeout;   // RREQ重试超时时间(毫秒)
    uint8_t max_rreq_retries;      // 最大RREQ重试次数
    uint32_t path_expiry_time;     // 路径过期时间(毫秒)
} aodv_config_t;

#endif /* AODV_TYPES_H */